package accesoDatos;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import entidades.*;

public class adPersonas extends adDatos {	
	public void agregarPersona(Persona personaActual)
    {
		int ultimo = 0;
        Connection oCnn = crearConexion();

        StringBuilder sb = new StringBuilder();
        sb.append(" INSERT INTO personas( ");
        sb.append("     nombre, ");
        sb.append("     apellido, ");
        sb.append("     direccion, ");
        sb.append("     email, ");
        sb.append("     telefono, ");
       // sb.append("     fecha_nac, ");
        sb.append("     legajo, ");
        sb.append("     tipo_persona, ");
        sb.append("     id_plan ");
        sb.append(" ) ");
        sb.append(" VALUES ( '");
       //creo q tiene q ir	el get.ej:personaActual.getApellido(). tambien hay q encerar en ''todos los valores q son String!
       //corrigo nombres como casi estoy seguro q iria. NOTAR LAS COMILLAS SIMPLES EN VALUES Y EN LA COMA.
        sb.append(      personaActual.getNombre()+ "','");
        sb.append(	    personaActual.getApellido()+ "','");
        sb.append(	    personaActual.getDireccion()+ "','");
        sb.append(	    personaActual.getEmail()+ "','");
        sb.append(		personaActual.getTelefono()+ "',");
        //sb.append(		personaActual.getFechaNac()+ "',");
        sb.append(		personaActual.getLegajo()+ ",");
        sb.append(		personaActual.getIntTipoPersona()+ ",");
        sb.append(		personaActual.getIdPlan());
        sb.append(" ); ");
        
		
		 StringBuilder sbUltimo = new StringBuilder();
		 sbUltimo.append("select max(id_persona) as ultimoId from personas; ");
		 
        
		 
        try {
			Statement cmdInsertarPersona = oCnn.createStatement();
			cmdInsertarPersona.executeUpdate(sb.toString());
	
			/*esto no lo ongo en una funcion porq soy negro */
		        try {
		        	Statement cmdGetUltimoId = oCnn.createStatement();
		        	ResultSet rsUltimoId = cmdGetUltimoId.executeQuery(sbUltimo.toString());
		        	
		        	 while (rsUltimoId.next()){
		        		 ultimo = rsUltimoId.getInt("ultimoId");
		        	 }
		        	 
		        	 
		        	 StringBuilder sbFecha = new StringBuilder();
		    		 sbFecha.append("update personas ");
		    	     sbFecha.append("set fecha_nac = '"+ personaActual.getFechaNac() + "'");
		    	     sbFecha.append(" where id_persona = "+ultimo+";");
					Statement cmdInsertarFecha = oCnn.createStatement();
					cmdInsertarFecha.executeUpdate(sbFecha.toString());
					oCnn.close();
				} catch (SQLException e) {
					e.printStackTrace();
					System.out.println("ERROR: No se pudo agregar la Fecha en persona.");

				}
		        
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("ERROR: No se pudo agregar la persona.");

		}

		
    }
	
	public void borrarPersona(int id_persona)
    {
        Connection oCnn = crearConexion();
        
        StringBuilder sb = new StringBuilder();

        sb.append(" DELETE FROM personas ");
        sb.append(" WHERE id_persona = "+id_persona+"; ");

        try{
        	Statement cmdBorrarPersona = oCnn.createStatement();
        	cmdBorrarPersona.executeUpdate(sb.toString());
        	oCnn.close();
        } catch (SQLException e) {
			e.printStackTrace();
			System.out.println("ERROR: No se pudo borrar la Persona.");
		}
    }
	
	public void modificarPersona(Persona personaActual)
    {
        Connection oCnn = crearConexion();

        StringBuilder sb = new StringBuilder();
        sb.append(" UPDATE personas ");
        sb.append(" SET  ");
        sb.append("     nombre = '"+personaActual.getNombre()+"' ");
        sb.append("     ,apellido = '"+personaActual.getApellido()+"' ");
        sb.append("     ,direccion = '"+personaActual.getDireccion()+"' ");
        sb.append("     ,email = '"+personaActual.getEmail()+"' ");
        sb.append("     ,telefono = '"+personaActual.getTelefono()+"' ");
       // sb.append("     ,fecha_nac = '"+personaActual.getFechaNac()+"' ");
        sb.append("     ,legajo = "+personaActual.getLegajo()+" ");
        sb.append("     ,tipo_persona = "+personaActual.getIntTipoPersona()+" ");
        sb.append("     ,id_plan = "+personaActual.getIdPlan()+" ");
        sb.append(" WHERE id_persona = "+personaActual.getId()+" ");

        try{
        	Statement cmdModificarPersona = oCnn.createStatement();
        	cmdModificarPersona.executeUpdate(sb.toString());
        	oCnn.close();
        } catch (SQLException e) {
			e.printStackTrace();
			System.out.println("ERROR: No se pudo modificar la persona.");
		}

        adUsuarios objAdUsuario = new adUsuarios();
        objAdUsuario.modificarUsuarioDePersona(personaActual);
    }
	
	public Persona getPersona(int id_persona)
    {
        Persona personaActual = new Persona();
        Connection oCnn = crearConexion();

        StringBuilder sb = new StringBuilder();
        sb.append(" SELECT ");
        sb.append(" * ");
        sb.append(" FROM personas ");
        sb.append(" WHERE id_persona = "+id_persona+"; ");

        try{
        	Statement cmdGetPersona = oCnn.createStatement();
        	ResultSet rsPersonas = cmdGetPersona.executeQuery(sb.toString());
        	if (rsPersonas.next()==true){
        		rsPersonas.beforeFirst();
    	        
    	        while (rsPersonas.next()){
    	        	personaActual.setId(rsPersonas.getInt("id_persona"));
    	        	personaActual.setApellido(rsPersonas.getString("apellido"));
    	        	personaActual.setNombre(rsPersonas.getString("nombre"));
    	        	personaActual.setDireccion(rsPersonas.getString("direccion"));
    	        	personaActual.setEmail(rsPersonas.getString("email"));
    	        	//personaActual.setFecha_nac(rsPersonas.getString("fecha_nac")); //esto puede tener problemas porq trae un tipo Date de la DB
    	        	personaActual.setLegajo(rsPersonas.getInt("legajo"));
    	        	personaActual.setIdPlan(rsPersonas.getInt("id_plan"));
    	        	
    	        	personaActual.setTelefono(rsPersonas.getString("telefono"));
    	        	//Obtengo de la DB un int y lo paso a Tipo_Persona
    	        	int tipoInt = (rsPersonas.getInt("tipo_persona"));
    	        	Tipo_Persona tipo = Tipo_Persona.convertToTipoPersona(tipoInt);
    	        	personaActual.setTipoPersona(tipo);
    	        	
    	        	adUsuarios objAdUsu = new adUsuarios();
    	            objAdUsu.getUsuarioParaPersona(personaActual);
    	        }
    	    }
        	oCnn.close();
        } catch (SQLException e) {
			e.printStackTrace();
			System.out.println("ERROR: No se pudo obtener la persona.");
		}
        return personaActual;
    }
	
	public ArrayList<Persona> recuperarTodos(int tipo_persona)
    {
        Connection oCnn = crearConexion();
        ArrayList<Persona> listaPersonas = new ArrayList<Persona>();
        Persona personaActual;

        StringBuilder sb = new StringBuilder();

        sb.append(" SELECT p.*, pl.desc_plan FROM personas p ");
        sb.append(" INNER JOIN planes pl ON p.id_plan = pl.id_plan ");

        //tipo_persona = -1 cuando quiero traer todos las personas
        if (tipo_persona != -1)
        {
        	sb.append(" WHERE tipo_persona = ");
        	sb.append(tipo_persona);
        }

        try{
        	Statement cmdRecuperarPersonas = oCnn.createStatement();
        	ResultSet rsPersonas = cmdRecuperarPersonas.executeQuery(sb.toString());
        	if (rsPersonas.next()==true){
        		rsPersonas.beforeFirst();
    	        
    	        while (rsPersonas.next()){
    	        	personaActual = new Persona();
    	        	
    	        	personaActual.setId(rsPersonas.getInt("id_persona"));
    	        	personaActual.setApellido(rsPersonas.getString("apellido"));
    	        	personaActual.setNombre(rsPersonas.getString("nombre"));
    	        	personaActual.setDireccion(rsPersonas.getString("direccion"));
    	        	personaActual.setEmail(rsPersonas.getString("email"));
    	        	personaActual.setFecha_nac(rsPersonas.getString("fecha_nac")); //esto puede tener problemas porq trae un tipo Date de la DB
    	        	personaActual.setLegajo(rsPersonas.getInt("legajo"));
    	        	personaActual.setIdPlan(rsPersonas.getInt("id_plan"));
    	        	personaActual.setTelefono(rsPersonas.getString("telefono"));
    	        	
    	        	//Obtengo de la DB un int y lo paso a Tipo_Persona
    	        	int tipoInt = (rsPersonas.getInt("tipo_persona"));
    	        	Tipo_Persona tipo = Tipo_Persona.convertToTipoPersona(tipoInt);
    	        	personaActual.setTipoPersona(tipo);
    	        	
    	        	adUsuarios objAdUsu = new adUsuarios();
    	            objAdUsu.getUsuarioParaPersona(personaActual);

    	            listaPersonas.add(personaActual);
    	        }
    	    }
        	oCnn.close();
        } catch (SQLException e) {
			e.printStackTrace();
			System.out.println("ERROR: No se pudo obtener las personas.");
		}
        return listaPersonas;
    }
	
	public int getUltimoIDPersona()
    {
        Connection oCnn = adDatos.crearConexion();
        int ultID = 0;
        String sql = "SELECT id_persona FROM personas ORDER BY id_persona DESC LIMIT 1";

        try{
        	Statement cmdGetUltimoID = oCnn.createStatement();
        	ResultSet rsPersonas = cmdGetUltimoID.executeQuery(sql);
        	if (rsPersonas.next() == true){
        		rsPersonas.beforeFirst();
        	
        		while (rsPersonas.next())
        		{
        			ultID = (rsPersonas.getInt("id_persona"));
        		}
        	}

            oCnn.close();
        	
        } catch(SQLException e) {
			e.printStackTrace();
			System.out.println("ERROR: No se pudo obtener el ultimo ID.");
		}
        return ultID;
    }
	
	public boolean existeLegajo(String legajo)
    {
        Connection oCnn = adDatos.crearConexion();
        String sql = "SELECT * FROM personas WHERE legajo = '"+legajo+"'";

        try{
        	Statement cmdExisteLegajo = oCnn.createStatement();
        	ResultSet rsPersonas = cmdExisteLegajo.executeQuery(sql);
        	oCnn.close();
        	return rsPersonas.isFirst();
        	
        } catch(SQLException e) {
			e.printStackTrace();
			System.out.println("ERROR: No se pudo comprobar si existe el legajo.");
		}
        return false;
    }
      
	
}
